package kgame5.k25d.core {
	import flash.events.EventDispatcher;
	import kgame5.k25d.Util25D;
	import kgame5.k25d.core.group.Group25D;
	import kgame5.k25d.core.group.World25D;
	import kgame5.k3d.core.math.Vector3D;
	import kgame5.k3d.core.obj3d.spacial.SpacialVO;

	import flash.display.DisplayObject;

	/**
	 * @author max
	 * 2010-12-13
	 * 
	 * 这个类比于displayObject-InteractiveDisplayObject，可以对外发送交互事件（比如点击和拖拽等）
	 */
	public class Node25D extends EventDispatcher{
		
		public static const CLICK:String="CLICK";
		public static const MOUSE_DOWN:String="MOUSE_DOWN";
		public static const MOUSE_MOVE:String="MOUSE_MOVE";
		public static const MOUSE_UP:String="MOUSE_UP";
		

		//public static var FreeID:int=1;
		//public var id:int=FreeID++;
		
		
		
		//在哪个图层，是辅助数据,为了降低排序量而作
		public var _layerID:int=-1;
		
		//逻辑世界的信息
		public var spcVO:SpacialVO=new SpacialVO();
		
		protected var v3d_screen:Vector3D=new Vector3D();//屏幕坐标，z是depth
		
		public var visible:Boolean=true;
		
		//屏幕坐标
		//public var screenX:int;
		//public var screenY:int;
		public var depth:Number;//排序用
		
		//暂时还没用到
		///public var extraData:Object;//扩展用的，很有用
		
		public function Node25D(){
			
		}
			//##注意,group的这个是返回的一个mc,这个要被子类继承
	public function getDO():DisplayObject{
		return null;
	}
		//从3D空间向屏幕投影
		public function update(camera:Camera25D):void{
			if(visible==false){
				return;
			}
			getDO().visible=true;//先显示
			
			
			Util25D.worldToScreen(spcVO.v3d_p, v3d_screen);
			
			getDO().x=v3d_screen.x;
			getDO().y=v3d_screen.y;
			
			depth=v3d_screen.z;
			
			if(camera.canCull(getDO())){//如果出了屏幕，则不显示
				getDO().visible=false;//
			}
			
		}
		
			
	//**********************固定的不需要子类特别实现的**************************
	//!!销毁自己 ,释放自己所占的内存，mesh3D和sprite3D用这个默认的， Loader要用其他的
	public function dispose():void{
		//T.p("Model3D.dispose");
		//1,从父中剔除
		var p:Group25D=this.getParent();
		if(p!=null){
			p.removeChild(this);
		}
	}
	
	
	
	
	//---
	protected var parentNode:Group25D;
	public function setParent(p:Group25D):void{
		parentNode=p;
	}
	public function getParent():Group25D{
		return parentNode;
	}
	
	//---
	private var world:World25D=null;//保存对world的引用，就跟mc.stage一样
	public function getWorld():World25D{
		if(world!=null){//world只有一个，取出来即可
			return world;
		}
		//查找并设置自己的world
		var tempP:Group25D=parentNode;
		while(true){
			if((tempP is World25D)){
				break;
			}
			if(tempP==null){
				break;
			}
		}
		
		world=tempP as World25D;
		return world;
	}
	}//end of class
}
